package com.cc.pokergame.model;

import android.content.Context;
import android.content.SharedPreferences;
import android.view.View;
import android.widget.ImageView;

import com.cc.pokergame.R;

import java.util.ArrayList;

/**
 * 游戏中心类
 */
public class GameCenter {
    // 玩家管理对象
    private PlayerManager playerManager = new PlayerManager();
    // 创建牌管理对象
    private PokerManager pokerManager = new PokerManager();
    // 当前桌默认下注金额
    private int tableMoney = 0;
    // 当前桌一共下注金额
    private int tableCountMoney = 0;
    // 全局拿到下注金币
    private int betAmount = 0;
    // 钱发生变化监听者
    private OnMoneyChangeListener moneyChangeListener = null;
    // 游戏结束监听者
    private OnGameOverListener gameOverListener = null;

    /**
     * 设置牌桌下注金额
     * @param tableMoney 该牌桌底注的金额
     */
    public void setTableMoney(int tableMoney) {
        this.tableMoney = tableMoney;
    }

    /**
     * 在创建游戏中心对象时监听玩家活跃状态数
     */
    public GameCenter() {
        playerManager.setOnActivePlayerChangeListener(count -> {
            // 判断玩家的人数
            if (count == 1) {
                gameOver();

                // 判断当前gameOverListener是否为空
                if (gameOverListener != null) {
                    gameOverListener.gameOver();
                }
            }
        });

        playerManager.setOnPkFinishedListener(() -> {
            gameOver();
            // 判断当前gameOverListener是否为空
            if (gameOverListener != null) {
                gameOverListener.gameOver();
            }
        });

        playerManager.setOnPkFinishedListener(() -> {
            gameOver();
            if (gameOverListener != null) {
                gameOverListener.gameOver();
            }
        });
    }

    /**
     * 游戏中心初始化
     *
     * @param playerViews 玩家视图列表
     * @param pokerViews  牌视图列表
     */
    public void init(ArrayList<View> playerViews, ArrayList<CardModel> pokerViews) {
        //playerManager.addPlayer(R.drawable.musk, "马斯克1", 1000000, playerViews.get(0), pokerViews.get(0));
        addUserInfo(playerViews.get(0), pokerViews.get(0));
        playerManager.addPlayer(R.drawable.curry, "库里", 1000000, playerViews.get(1), pokerViews.get(1));
    }

    /**
     * 添加玩家本地玩家信息
     * @param playerView 玩家视图
     * @param pokerView 牌视图
     */
    private void addUserInfo(View playerView, CardModel pokerView) {
        SharedPreferences userInfo = playerView.getContext().getSharedPreferences("userInfo", Context.MODE_PRIVATE);
        String name = userInfo.getString("name", "");
        int money = userInfo.getInt("money", 0);
        String headName = userInfo.getString("headName", "");

        // 拼接头像图片文件的完整路径，得到当前文件目录使用.getAbsolutePath()得到文件目录路径字符串
        String headFilePath = playerView.getContext().getFilesDir().getAbsolutePath()+ "/" + headName;
        playerManager.addPlayer(headFilePath, name, money, playerView, pokerView);
    }

    /**
     * 游戏开始
     */
    public void start() {
        // 获取当前拍桌下注的金额
        tableCountMoney = playerManager.deductTableMonet(tableMoney);
        // 判断桌下注钱变化moneyChangeListener是否为空
        if (moneyChangeListener != null) {
            moneyChangeListener.tableMoneyChanged(tableCountMoney);
        }

        // 发牌
        dealCard();

        // 当游戏一开始就让第一个玩家进行操作
        playerManager.changeOrder();
    }

    /**
     * 发牌
     */
    private void dealCard() {
        // 拿到玩家对象
        Player player = playerManager.nextPlayer();
        while (player != null) {
            // 随机获取到一张牌对象
            Poker randomPoker = pokerManager.getRandomPoker();
            // 给玩家设置拿到的牌
            player.setPlayerPoker(randomPoker);
            // 轮到下一个玩家拿牌
            player = playerManager.nextPlayer();


        }
//        playerManager.showPlayer();
    }

    // 设置拍桌下注钱的变化
    public void setOnMoneyChangeListener(OnMoneyChangeListener onMoneyChangeListener) {
        this.moneyChangeListener = onMoneyChangeListener;

    }

    /**
     * 游戏结束
     */
    public void gameOver() {
        // 游戏结束时，给赢的玩家添加金币
        playerManager.awardWinner(tableCountMoney);
    }

    /**
     * 重置游戏
     */
    public void resetGame() {
        // 设置游戏总金额
        tableCountMoney = 0;
        // 重置玩家状态
        playerManager.resetPlayer();
        // 重置一副牌
        pokerManager.constructPoker();
    }

    /**
     * 弃牌操作
     */
    public void giveUp() {
        playerManager.giveUp();
        playerManager.changeOrder();
    }

    /**
     * 加注操作
     */
    public void betting() {
        // 玩家加注金额
        int bet = playerManager.betting(tableMoney);
        tableCountMoney += bet;

        if (bet < betAmount) {
            pk();
        }
        // 保存下注的金币
        betAmount = bet;

        // 监听牌桌底注变化
        if (moneyChangeListener != null) {
            moneyChangeListener.tableMoneyChanged(tableCountMoney);
        }

        // 寻找下一个玩家
        playerManager.changeOrder();
    }

    /**
     * pk操作
     */
    public void pk() {
        // 玩家选择pk操作需要扣除自己的金币，进入pk操作
        tableCountMoney += playerManager.pk(betAmount);

        // 监听牌桌底注金额的变化
        if (moneyChangeListener != null) {
            moneyChangeListener.tableMoneyChanged(tableCountMoney);
        }
    }

    // 定义监听拍桌下注钱接口
    public interface OnMoneyChangeListener {
        void tableMoneyChanged(int money);
    }

    // 设置接口
    public void setOnGameOverListener(OnGameOverListener listener) {
        this.gameOverListener = listener;
    }

    // 定义游戏结束接口
    public interface OnGameOverListener {
        void gameOver();
    }
}
